package com.ts.opengl.simpleDraw

import android.content.Context
import android.opengl.GLES20.GL_ARRAY_BUFFER
import android.opengl.GLES20.GL_ELEMENT_ARRAY_BUFFER
import android.opengl.GLES20.GL_FLOAT
import android.opengl.GLES20.GL_NONE
import android.opengl.GLES20.GL_STATIC_DRAW
import android.opengl.GLES20.GL_TRIANGLES
import android.opengl.GLES20.glBindBuffer
import android.opengl.GLES20.glBufferData
import android.opengl.GLES20.glDrawArrays
import android.opengl.GLES20.glEnableVertexAttribArray
import android.opengl.GLES20.glGenBuffers
import android.opengl.GLES20.glGetError
import android.opengl.GLES20.glUseProgram
import android.opengl.GLES20.glVertexAttribPointer
import android.opengl.GLES30
import android.opengl.GLES30.glBindVertexArray
import android.opengl.GLES30.glGenVertexArrays
import android.opengl.GLSurfaceView
import android.util.Log
import com.ts.audiocamera.R
import java.nio.ByteBuffer
import java.nio.ByteOrder
import java.nio.FloatBuffer
import java.nio.IntBuffer
import javax.microedition.khronos.egl.EGLConfig
import javax.microedition.khronos.opengles.GL10

class VBORender(var context:Context):GLSurfaceView.Renderer {
    var VERTEX: FloatArray = floatArrayOf(
        // positions         // colors
        0.5f, 0.5f, 0.0f,   1.0f, 0.5f, 0.5f,// 右上角
        0.5f, -0.5f, 0.0f,  1.0f, 0.0f, 1.0f,// 右下角
        -0.5f, 0.5f, 0.0f,  0.0f, 0.5f, 1.0f,// 左上角
       )

    //第二个三角形
    private val POINT_COLOR_DATA2 = floatArrayOf(
        // positions         // colors
        0.5f, -0.5f, 0.0f,  1.0f, 0.7f, 0.5f,// 右下角
        -0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f,// 左下角
        -0.5f, 0.5f, 0.0f,   0.0f, 0.5f, 1.0f,// 左上角
    )

//private val VERTEX = floatArrayOf(
//    // positions         // colors
//    0.5f, 0.5f, 0.0f,   1.0f, 0.5f, 0.5f,// 右上角
//    0.5f, -0.5f, 0.0f,  1.0f, 0.5f, 0.5f,// 右下角
//
//    -0.5f, -0.5f, 0.0f, 1.0f, 0.5f, 0.5f,// 左下角
//    -0.5f, 0.5f, 0.0f,  1.0f, 0.5f, 0.5f,// 左上角
//)
    /**
     *  0.6f, 0.6f, 0.6f,1.0f,
     *         0.7f, 0.6f, 0.6f,1.0f,
     *         0.6f, 0.6f, 0.6f,1.0f
     */
    private val indeices = intArrayOf(
        // 注意索引从0开始!
        // 此例的索引(0,1,2,3)就是顶点数组vertices的下标，
        // 这样可以由下标代表顶点组合成矩形

        0, 1, 3, // 第一个三角形
        1, 2, 3  // 第二个三角形
    )
    lateinit var vertexBuffer: FloatBuffer
    lateinit var vertexBuffer2: FloatBuffer
    var eleBuffer: IntBuffer?=null
    private var program=0;
    override fun onSurfaceCreated(gl: GL10?, config: EGLConfig?) {
        program=openglUtil.createProgram(context, R.raw.tri_ver, R.raw.tri_frg);

//      program=openglUtil.createProgram(context, R.raw.tri_ver,R.raw.tri_frg);
//      建立通道
        vertexBuffer =
            ByteBuffer.allocateDirect(VERTEX.size * 4)
                .order(ByteOrder.nativeOrder())
                .asFloatBuffer()
        vertexBuffer?.put(VERTEX)
        vertexBuffer?.position(0)

        vertexBuffer2=
            ByteBuffer.allocateDirect(POINT_COLOR_DATA2.size * 4)
                .order(ByteOrder.nativeOrder())
                .asFloatBuffer()
        vertexBuffer2?.put(POINT_COLOR_DATA2)
        vertexBuffer2?.position(0)

        eleBuffer =
            ByteBuffer.allocateDirect(indeices.size * 4)
                .order(ByteOrder.nativeOrder())
                .asIntBuffer()
        eleBuffer?.put(indeices)
        eleBuffer?.position(0)
        useVboAndEbo()

//        vaovbo()
    }


    var vbo=IntArray(2)
    var vao=IntArray(1)
    fun vaovbo(){


        //创建vbo
        glGenBuffers(vbo.size,vbo,0)
        //创建vao
        glGenVertexArrays(vao.size,vao,0)
        //绑定 VAO ,之后再绑定 VBO
        glBindVertexArray(vao[0])
        //绑定VBO
        GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,vbo[0])
        //数据绑定
        GLES30.glBufferData(
            GLES30.GL_ARRAY_BUFFER,
            vertexBuffer.capacity() * 4,
            vertexBuffer,
            GLES30.GL_STATIC_DRAW)
        //绘制位置
        GLES30.glVertexAttribPointer(
            0, 3, GLES30.GL_FLOAT,
            false, 24, 0
        )


        //使数据有效
        GLES30.glEnableVertexAttribArray(0)

        vertexBuffer.position(3)
        GLES30.glVertexAttribPointer(
            1, 3, GLES30.GL_FLOAT,
            false, 24, 12 //需要指定颜色的地址 3 * 4
        )
        GLES30.glEnableVertexAttribArray(1)
        //解绑数据
        GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,0)
        GLES30.glBindVertexArray(0)
//        GLES30.glDisableVertexAttribArray(0)


        //绑定第二个 vbo
//        val vertexData2 = BufferUtil.createFloatBuffer(POINT_COLOR_DATA2)

//        GLES30.glBindVertexArray(vao[1])
        GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,vbo[1])
        GLES30.glBufferData(
            GLES30.GL_ARRAY_BUFFER,
            vertexBuffer2.capacity() * 4,
            vertexBuffer2,
            GLES30.GL_STATIC_DRAW)
        //绘制位置
        GLES30.glVertexAttribPointer(
            0, 3, GLES30.GL_FLOAT,
            false, 24, 0
        )
        GLES30.glEnableVertexAttribArray(0)

        //绘制颜色，颜色地址偏移量从3开始，前面3个为位置
        vertexBuffer2.position(3)
        GLES30.glVertexAttribPointer(
            1, 3, GLES30.GL_FLOAT,
            false, 24, 12 //需要指定颜色的地址 3 * 4
        )
        GLES30.glEnableVertexAttribArray(1)

        //解绑数据
        GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,0)
        GLES30.glBindVertexArray(0)
    }

//    var vbo=IntArray(2);
    private fun useVboAndEbo(){

        glGenBuffers(2,vbo,0)
        glBindBuffer(GL_ARRAY_BUFFER,vbo[0])
        glBufferData(GL_ARRAY_BUFFER,
            vertexBuffer?.capacity()?.times(4) ?: 0,
            vertexBuffer,GLES30.GL_STATIC_DRAW)


        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,vbo[1])
        glBufferData(GL_ELEMENT_ARRAY_BUFFER,
            eleBuffer?.capacity()?.times(4) ?: 0,
            eleBuffer,GLES30.GL_STATIC_DRAW)


        glVertexAttribPointer(0,3, GL_FLOAT,
            false,24,0)

        glEnableVertexAttribArray(0)

        vertexBuffer?.position(3)
        GLES30.glVertexAttribPointer(
            1, 3, GLES30.GL_FLOAT,
            false, 24, 12
        //需要指定颜色的地址 3 * 4
        )
        glEnableVertexAttribArray(1)
        glBindBuffer(GLES30.GL_ARRAY_BUFFER,0)

    }
    private fun useVbo(){

        val vbo= IntArray(1)

        //创建缓存区
        GLES30.glGenBuffers(1,vbo,0)
        //绑定缓存区到上下文
        GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,vbo[0])
        //将顶点数据存在缓冲区
        GLES30.glBufferData(
            GLES30.GL_ARRAY_BUFFER,
            vertexBuffer?.capacity()?.times(4) ?: 0,
            vertexBuffer,
            GLES30.GL_STATIC_DRAW)
        //绘制位置，注意这里，我们不再填入 vertexData，而是填入数据偏移地址
        GLES30.glVertexAttribPointer(
            0, 3, GLES30.GL_FLOAT,
            false, 24, 0
        )
        GLES30.glEnableVertexAttribArray(0)

        //绘制颜色，颜色地址偏移量从3开始，前面3个为位置
//        vertexBuffer
//            ?.position(3)
        GLES30.glVertexAttribPointer(
            1, 3, GLES30.GL_FLOAT,
            false, 24, 12
            //需要指定颜色的地址 3 * 4
        )
        GLES30.glEnableVertexAttribArray(1)
        GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,0)
        //解绑数据，因为我们不需要动态更新

    }

    override fun onSurfaceChanged(gl: GL10?, width: Int, height: Int) {
        GLES30.glViewport(0, 0, width, height)
    }

    private  val TAG = "VBORender"

    override fun onDrawFrame(gl: GL10?) {
        GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT)

        GLES30.glBindVertexArray(vao[0])
//        GLES30.glBindVertexArray(vao[1])
        GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP,0,3)

//      glBindBuffer(GLES30.GL_ARRAY_BUFFER,0)
//      glDrawArrays (GL_TRIANGLES, 0, 3);
//
//      glUseProgram (GL_NONE);
//      useVbo()
//      glBindVertexArray(0);
//        GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,0)
//        GLES30.glDrawElements(GLES30.GL_TRIANGLE_STRIP,0,3)
//         GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,vbo[0])
//         GLES30.glBindBuffer(GLES30.GL_ELEMENT_ARRAY_BUFFER,vbo[1])
//         GLES30.glDrawElements(GLES30.GL_TRIANGLE_STRIP,6,GLES30.GL_UNSIGNED_INT,0)
    }



}